#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Django项目快速搭建脚本
功能：
1. 提示用户输入项目名称和路径
2. 创建项目文件夹结构
3. 复制模板文件
4. 替换相关配置中的项目名称
5. 可选配置数据库
"""

import os
import shutil
import subprocess
import re
from pathlib import Path


def get_user_input():
    """
    获取用户输入的项目信息
    """
    # 获取项目名称
    project_name = input("请输入项目名称: ").strip()
    while not project_name:
        print("项目名称不能为空，请重新输入！")
        project_name = input("请输入项目名称: ").strip()
    
    # 获取项目路径，默认为当前目录
    project_path = input("请输入项目路径（默认为当前目录）: ").strip()
    if not project_path:
        project_path = os.getcwd()
    
    # 确保路径存在
    if not os.path.exists(project_path):
        print(f"警告：路径 {project_path} 不存在，将创建该路径")
        os.makedirs(project_path, exist_ok=True)
    
    # 获取数据库名称，可选
    db_name = input("请输入数据库名称（可选，不输入则不创建数据库）: ").strip()
    
    return project_name, project_path, db_name


def create_project_structure(project_name, project_path):
    """
    创建项目文件夹结构
    """
    # 创建项目根目录
    project_root = os.path.join(project_path, project_name)
    
    # 如果目录已存在，询问是否覆盖
    if os.path.exists(project_root):
        response = input(f"项目目录 {project_root} 已存在，是否覆盖？(y/n): ").strip().lower()
        if response != 'y':
            print("项目创建已取消")
            return None
        # 删除已存在的目录
        shutil.rmtree(project_root)
    
    # 创建项目目录
    os.makedirs(project_root, exist_ok=True)
    print(f"已创建项目目录: {project_root}")
    
    return project_root


def copy_template_files(project_root):
    """
    复制模板文件到新项目目录
    """
    # 获取模板目录路径
    template_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static')
    
    if not os.path.exists(template_dir):
        print(f"错误：模板目录 {template_dir} 不存在")
        return False
    
    try:
        # 复制所有文件和目录
        shutil.copytree(template_dir, project_root, dirs_exist_ok=True)
        print(f"已成功复制模板文件到 {project_root}")
        return True
    except Exception as e:
        print(f"复制模板文件时出错: {str(e)}")
        return False


def replace_project_name_in_files(project_root, project_name):
    """
    在文件中替换项目名称
    """
    # 替换apps.py中的项目名称
    api_apps_path = os.path.join(project_root, 'BloodSpiderAPI', 'apps.py')
    web_apps_path = os.path.join(project_root, 'BloodSpiderWeb', 'apps.py')
    manage_py_path = os.path.join(project_root, 'manage.py')
    prroject_name_dir = os.path.join(project_root, 'PrrojectName')
    
  

    # 替换manage.py
    if os.path.exists(manage_py_path):
        replace_in_file(manage_py_path, 'BSAutoOrder', project_name)
    
    # 替换PrrojectName目录下的文件
    if os.path.exists(prroject_name_dir):
        # 重命名PrrojectName目录
        new_project_dir = os.path.join(project_root, project_name)
        shutil.move(prroject_name_dir, new_project_dir)
        print(f"已将PrrojectName目录重命名为 {project_name}")
        
        # 替换目录下所有文件中的PrrojectName和BSAutoOrder
        for root, _, files in os.walk(new_project_dir):
            for file in files:
                if file.endswith('.py'):
                    file_path = os.path.join(root, file)
                    replace_in_file(file_path, 'PrrojectName', project_name)
                    replace_in_file(file_path, 'BSAutoOrder', project_name)
    

    print(f"已完成项目名称替换: BloodSpiderAPI -> {project_name}API, BloodSpiderWeb -> {project_name}Web, BSAutoOrder -> {project_name}")


def replace_in_file(file_path, old_text, new_text):
    """
    在文件中替换文本
    """
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # 如果有需要替换的内容
        if old_text in content:
            content = content.replace(old_text, new_text)
            with open(file_path, 'w', encoding='utf-8') as f:
                f.write(content)
    except Exception as e:
        print(f"替换文件 {file_path} 中的文本时出错: {str(e)}")


def create_mysql_database(db_name):
    """
    创建MySQL数据库
    """
    if not db_name:
        return True
    
    try:
        # 使用root用户和密码123456创建数据库
        cmd = f'mysql -u root -p123456 -e "CREATE DATABASE IF NOT EXISTS {db_name} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"'
        print(f"正在创建数据库: {db_name}")
        
        # 执行命令
        subprocess.run(cmd, shell=True, check=True)
        print(f"数据库 {db_name} 创建成功")
        return True
    except subprocess.CalledProcessError as e:
        print(f"创建数据库时出错: {str(e)}")
        print("请确保MySQL服务已启动，并且root用户有正确的权限")
        return False


def configure_database_settings(project_root, project_name, db_name):
    """
    配置数据库设置
    """
    settings_path = os.path.join(project_root, project_name, 'settings.py')
    
    if not os.path.exists(settings_path):
        print(f"错误：设置文件 {settings_path} 不存在")
        return
    
    try:
        with open(settings_path, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # 查找DATABASES配置块
        db_pattern = re.compile(r'DATABASES\s*=\s*{[^}]*}', re.DOTALL)
        match = db_pattern.search(content)
        
        if db_name:
            # 创建数据库配置
            new_db_config = """DATABASES = {{
    'default': {{
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'project_name',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {{'charset': 'utf8mb4'}}
    }}
}}
"""
            new_db_config = new_db_config.replace('project_name', project_name)
            
            if match:
                # 如果找到现有配置，则替换
                content = db_pattern.sub(new_db_config, content)
                print(f"已更新数据库配置，使用数据库: {db_name}")
            else:
                # 如果没有找到配置，则添加到文件末尾
                # 确保在添加前有一个空行
                if not content.endswith('\n\n') and not content.endswith('\n'):
                    content += '\n'
                content += '\n' + new_db_config + '\n'
                print(f"已添加数据库配置，使用数据库: {db_name}")
        else:
            # 如果没有提供数据库名称，且找到配置，则注释掉
            if match:
                old_db_config = match.group(0)
                # 确保所有行都被正确注释，包括最后两个大括号
                lines = old_db_config.split('\n')
                commented_lines = ['#' + line if line.strip() else '#' for line in lines]
                commented_db_config = '\n'.join(commented_lines)
                content = content.replace(old_db_config, commented_db_config)
                print("已注释掉数据库配置")
        
        # 写回文件
        with open(settings_path, 'w', encoding='utf-8') as f:
            f.write(content)
    except Exception as e:
        print(f"配置数据库设置时出错: {str(e)}")



def main():
    """
    主函数
    """
    print("=== Django项目快速搭建工具 ===")
    print("本工具将帮助您快速创建一个Django项目结构")
    
    # 获取用户输入
    project_name, project_path, db_name = get_user_input()
    
    # 创建项目结构
    project_root = create_project_structure(project_name, project_path)
    if not project_root:
        return
    
    # 复制模板文件
    if not copy_template_files(project_root):
        print("复制模板文件失败，项目创建中断")
        return

    
    # 替换项目名称
    replace_project_name_in_files(project_root, project_name)
    
    # 创建数据库（如果用户提供了名称）
    db_created = True
    if db_name:
        db_created = create_mysql_database(db_name)
    
    # 配置数据库设置
    configure_database_settings(project_root, project_name, db_name if db_created else '')
    
    print("\n=== 项目创建完成 ===")
    print(f"项目路径: {project_root}")
    print("\n接下来您可以执行以下操作：")
    print(f"1. 进入项目目录: cd {project_root}")
    print("2. 安装依赖: pip install django mysqlclient corsheaders")
    print("3. 运行数据库迁移: python manage.py migrate")
    print("4. 创建超级用户: python manage.py createsuperuser")
    print("5. 启动开发服务器: python manage.py runserver")


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print("\n操作已取消")
    except Exception as e:
        print(f"发生错误: {str(e)}")